package ar.uade.distribuidas.tpo.dba.dominio;

import java.util.LinkedList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;

import org.joda.time.DateTime;

import ar.uade.distribuidas.tpo.base.dominiodto.FacturaDTO;
import ar.uade.distribuidas.tpo.base.dominiodto.ItemFacturaDTO;

@Entity
@Table(name = "facturas")
public class Factura {

	@Id
	private int numeroFactura;
	private String fechaEmision, fechaVencimiento;
	@OneToOne
	private Cliente cliente;
	@OneToMany(cascade = CascadeType.ALL)
	@JoinColumn(name = "factura_id")
	private List<ItemFactura> itemsFactura;
	private float precio;

	@OneToOne
	private CondicionDeVenta condicionVenta;

	public Factura() {
		itemsFactura = new LinkedList<ItemFactura>();
	}

	public Factura(int numero, String fechaEmision, String fechaVenciomiento, Cliente cliente, List<ItemFactura> itemsFactura,
			CondicionDeVenta condicionVenta) {
		super();
		this.numeroFactura = numero;
		this.fechaEmision = fechaEmision;
		this.fechaVencimiento = fechaVenciomiento;
		this.cliente = cliente;
		this.itemsFactura = itemsFactura;
		this.condicionVenta = condicionVenta;
	}
	
	public void calcularPrecio() {
		float precioFact = 0;
		
		for(ItemFactura i : this.itemsFactura) {
			precioFact += i.getPrecioTotal();
		}
		
		this.setPrecio(precioFact);
	}
	
	public FacturaDTO toDTO() {
		FacturaDTO dto = new FacturaDTO();
		
		dto.setCliente(cliente.toDTO());
		dto.setCondicionVenta(condicionVenta.toDTO());
		dto.setFechaEmision(fechaEmision);
		dto.setFechaVencimiento(fechaVencimiento);
		dto.setNumeroFactura(numeroFactura);
		List<ItemFacturaDTO> items = new LinkedList<ItemFacturaDTO>();
		dto.setItemsFactura(items);
		dto.setPrecio(precio);
		
		for(ItemFactura i : itemsFactura) {
			items.add(i.toDTO());
		}
		
		return dto;
	}
	
	public static Factura fromDTO(FacturaDTO dto) {
		Factura factura = new Factura();
		
		factura.setCliente(new Cliente(dto.getCliente()));
		factura.setCondicionVenta(CondicionDeVenta.fromDTO(dto.getCondicionVenta()));
		factura.setFechaEmision(dto.getFechaEmision());
		factura.setFechaVenciomiento(dto.getFechaVencimiento());
		factura.setNumero(dto.getNumeroFactura());
		List<ItemFactura> items = new LinkedList<ItemFactura>();
		factura.setItemsFactura(items);
		factura.setPrecio(dto.getPrecio());
		
		for(ItemFacturaDTO i : dto.getItemsFactura()) {
			items.add(ItemFactura.fromDTO(i));
		}
		
		return factura;
	}

	public int getNumero() {
		return numeroFactura;
	}

	public void setNumero(int numero) {
		this.numeroFactura = numero;
	}

	public String getFechaEmision() {
		return fechaEmision;
	}

	public void setFechaEmision(String fechaEmision) {
		this.fechaEmision = fechaEmision;
	}

	public String getFechaVenciomiento() {
		return fechaVencimiento;
	}

	public void setFechaVenciomiento(String fechaVenciomiento) {
		this.fechaVencimiento = fechaVenciomiento;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public List<ItemFactura> getItemsFactura() {
		return itemsFactura;
	}

	public void setItemsFactura(List<ItemFactura> itemsFactura) {
		this.itemsFactura = itemsFactura;
	}

	public CondicionDeVenta getCondicionVenta() {
		return condicionVenta;
	}

	public void setCondicionVenta(CondicionDeVenta condicionVenta) {
		this.condicionVenta = condicionVenta;
	}

	public int getNumeroFactura() {
		return numeroFactura;
	}

	public void setNumeroFactura(int numeroFactura) {
		this.numeroFactura = numeroFactura;
	}

	public String getFechaVencimiento() {
		return fechaVencimiento;
	}

	public void setFechaVencimiento(String fechaVencimiento) {
		this.fechaVencimiento = fechaVencimiento;
	}

	public float getPrecio() {
		return precio;
	}

	public void setPrecio(float precio) {
		this.precio = precio;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Factura other = (Factura) obj;
		if (cliente == null) {
			if (other.cliente != null)
				return false;
		} else if (!cliente.equals(other.cliente))
			return false;
		if (condicionVenta == null) {
			if (other.condicionVenta != null)
				return false;
		} else if (!condicionVenta.equals(other.condicionVenta))
			return false;
		if (fechaEmision == null) {
			if (other.fechaEmision != null)
				return false;
		} else if (!fechaEmision.equals(other.fechaEmision))
			return false;
		if (fechaVencimiento == null) {
			if (other.fechaVencimiento != null)
				return false;
		} else if (!fechaVencimiento.equals(other.fechaVencimiento))
			return false;
		if (itemsFactura == null) {
			if (other.itemsFactura != null)
				return false;
		} else if (!itemsFactura.equals(other.itemsFactura))
			return false;
		if (numeroFactura != other.numeroFactura)
			return false;
		return true;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((cliente == null) ? 0 : cliente.hashCode());
		result = prime * result + ((condicionVenta == null) ? 0 : condicionVenta.hashCode());
		result = prime * result + ((fechaEmision == null) ? 0 : fechaEmision.hashCode());
		result = prime * result + ((fechaVencimiento == null) ? 0 : fechaVencimiento.hashCode());
		result = prime * result + ((itemsFactura == null) ? 0 : itemsFactura.hashCode());
		result = prime * result + numeroFactura;
		return result;
	}

	@Override
	public String toString() {
		return "Factura [numeroFactura=" + numeroFactura + ", fechaEmision=" + fechaEmision + ", fechaVencimiento="
				+ fechaVencimiento + ", cliente=" + cliente + ", itemsFactura=" + itemsFactura + ", condicionVenta="
				+ condicionVenta + "]";
	}
	
	

}
